package com.petter.jvm.stack;

import com.petter.demo.User;

/**
 * 两次for 循环的局部变量
 * 例子中：循环中的i ,j 都只存在一个局部变量，所以定义再外面和定义再里面影响不大
 * 栈中的空间在编译这个代码的时候大小就确定下来了，运行这个方法时空间就已经分配好了(javap/jclasslib 查看字节码即可看出)
 *
 * 总结：
 * 1. 对于使用int等基本数据类型作为循环变量，只要你用的优化方面足够给力的主流的编译器，完全不需要关心在循环外还是循环内定义循环变量。
 * 2. 如果循环变量本身是复杂的对象，建议在循环外定义好，并且在for循环的赋值语句、判断语句中，都要避免重复创建对象。
 * @author : GD
 * @date :2021/9/16 : 11:21
 */
public class LocalVariableDoubleForTest {
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < 1000; j++) {
                User user = new User();
                Thread.sleep(100);
            }
        }
    }

    /**
     * 非静态方法，局部变量表第一位会添加this
     * double，long 会占两个槽 slot,其他占用一个槽
     * 槽的重复利用，c 不会再被引入，责d 会直接占用c 的槽，节约空间
     * 静态方法中不会有局部变量this ,不能引用this.xxxx
     * 局部变量不会进行init 操作，所有的变量必须赋值后才能使用，否则编译报错
     */
    public void test1(){
        int a = 1;
        double b = 1;
        if(true){
            int c = 2;
        }
        int d = 1;
    }



}
